home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / gcc / ixemulsrc.lha / ixemul-41.4 / library / ix_init.c < prev    next >
C/C++ Source or Header  |  1995-09-27  |  7KB  |  239 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *  Portions Copyright (C) 1994 Rafael W. Luebbert
  5.  *
  6.  *  This library is free software; you can redistribute it and/or
  7.  *  modify it under the terms of the GNU Library General Public
  8.  *  License as published by the Free Software Foundation; either
  9.  *  version 2 of the License, or (at your option) any later version.
  10.  *
  11.  *  This library is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  *  Library General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU Library General Public
  17.  *  License along with this library; if not, write to the Free
  18.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  *  $Id: ix_init.c,v 1.12 1994/07/11 22:16:47 rluebbert Exp $
  21.  *
  22.  *  $Log: ix_init.c,v $
  23.  *  Revision 1.12  1994/07/11  22:16:47  rluebbert
  24.  *  Removed arp.library from source - no longer needed.
  25.  *
  26.  *  Revision 1.11  1994/07/07  15:08:21  rluebbert
  27.  *  10*NOFILE -> NOFILE
  28.  *
  29.  *  Revision 1.10  1994/07/07  15:03:00  rluebbert
  30.  *  Removed ttyport dummy routines
  31.  *
  32.  *  Revision 1.9  1994/07/07  12:21:55  rluebbert
  33.  *  *** empty log message ***
  34.  *
  35.  *  Revision 1.8  1994/07/07  11:44:26  rluebbert
  36.  *  *** empty log message ***
  37.  *
  38.  *  Revision 1.7  1994/06/22  15:31:17  rluebbert
  39.  *  Re-enable global environment variables
  40.  *
  41.  *  Revision 1.6  1994/06/19  15:12:59  rluebbert
  42.  *  *** empty log message ***
  43.  *
  44.  *  Revision 1.4  1992/08/09  20:52:38  amiga
  45.  *  change to new way of remembering open libraries
  46.  *  get prepared to deal with ttys
  47.  *
  48.  *  Revision 1.3  1992/05/22  01:43:46  mwild
  49.  *  initialize buddy allocator
  50.  *
  51.  * Revision 1.2  1992/05/18  00:49:07  mwild
  52.  * changed async mp to be global
  53.  *
  54.  * Revision 1.1  1992/05/14  19:55:40  mwild
  55.  * Initial revision
  56.  *
  57.  */
  58.  
  59. #define KERNEL
  60. #include "ixemul.h"
  61. #include "kprintf.h"
  62.  
  63. #include <exec/memory.h>
  64. #include <dos/var.h>
  65.  
  66. /* not changed after the library is initialized */
  67. struct ixemul_base *ixemulbase = 0;
  68.  
  69. /* used by gnulib.. I was too lazy to convert that library as well ;-) */
  70. void *MathIeeeDoubBasBase, *MathIeeeDoubTransBase,
  71.      *MathIeeeSingBasBase;
  72.  
  73. struct ExecBase *SysBase;
  74.  
  75. /* global port for asynchronous packet notification */
  76. struct MsgPort *ix_async_mp;
  77. extern int mp_interrupt ();
  78.  
  79. /* global port for tty handling */
  80. struct MsgPort *ix_tty_mp;
  81. extern int tty_interrupt ();
  82.  
  83. /* since gcc can now statically initialize unions, they're quite useful;-) */
  84. union lib {
  85.   char *name;
  86.   struct Library *base;
  87. };
  88.  
  89.  
  90. void
  91. open_libraries (union lib *libs)
  92. {
  93.   SysBase = *(struct ExecBase **)4;
  94.   /* on input `libs' contains a pointer to the library name, on output it
  95.      contains the library base pointer */
  96.   do
  97.     libs->base = (struct Library *) OpenLibrary (libs->name, 0) ? : (struct Library *) -1;
  98.   while ((++libs)->name);
  99. }
  100.  
  101. void
  102. close_libraries (union lib *libs)
  103. {
  104.   do
  105.     if (libs->base != (struct Library *) -1)
  106.       CloseLibrary (libs->base);
  107.   while ((++libs)->base);
  108. }
  109.  
  110. /* these are the libraries we are potentially interested in. Not finding
  111.    a certain library doesn't mean we can't continue. */
  112. static union lib ix_libs[] = {
  113.   "dos.library",
  114.   "intuition.library",
  115.   "graphics.library",
  116.   "mathieeesingbas.library",
  117.   "mathieeedoubbas.library",
  118.   "mathieeedoubtrans.library",
  119.   0,
  120. };
  121. enum { DOS_LIB=0, INTUI_LIB, GFX_LIB, SINGB_LIB, DOUBB_LIB, DOUBT_LIB };
  122.  
  123.  
  124. struct ixemul_base *
  125. ix_init (struct ixemul_base *ixbase)
  126. {
  127.   int i;
  128.   char buf[256];
  129.  
  130.   ixemulbase = ixbase;
  131.   if(! check_hardware()) return 0;
  132.   open_libraries (ix_libs);
  133.  
  134.   /* these ones are necessary and are very (!) unlikely to be missing */
  135.   if (   ! (ixbase->ix_dos_base = ix_libs[DOS_LIB].base)
  136.       || ! (ixbase->ix_intui_base = (struct IntuitionBase *) ix_libs[INTUI_LIB].base)
  137.       || ! (ixbase->ix_gfx_base = (struct GfxBase *) ix_libs[GFX_LIB].base))
  138.     {
  139.       close_libraries (ix_libs);
  140.       return 0;
  141.     }
  142.   /* those are more or less optional, and if not available cause 
  143.      ix_patch_functions() to replace functions that need them by aborting
  144.      functions */
  145.       ixbase->ix_ms_base = 
  146.         MathIeeeSingBasBase = ix_libs[SINGB_LIB].base;
  147.     ixbase->ix_md_base =
  148.             MathIeeeDoubBasBase = ix_libs[DOUBB_LIB].base;
  149.     ixbase->ix_mdt_base =
  150.         MathIeeeDoubTransBase = ix_libs[DOUBT_LIB].base;
  151.   ixbase->ix_file_tab = (struct file *)
  152.     AllocMem (NOFILE * sizeof(struct file), MEMF_PUBLIC | MEMF_CLEAR);
  153.   ixbase->ix_fileNFILE = ixbase->ix_file_tab + NOFILE;
  154.   ixbase->ix_lastf = ixbase->ix_file_tab;
  155.   ixbase->ix_red_zone_size = 0; /* not enabled by default */
  156.   ixbase->ix_membuf_limit = 0;
  157.   ixbase->ix_fs_buf_factor = 64;
  158.   ixbase->ix_watch_stack = 0;
  159.   ixbase->ix_translate_dots = 1;
  160.   ixbase->ix_translate_slash = 1;
  161.   ixbase->ix_translate_symlinks = 0;
  162.   ixbase->ix_force_translation = 0;
  163.   ixbase->ix_ignore_global_env = 0;
  164.   ixbase->ix_unix_pattern_matching_case_sensitive = 0;
  165.   ixbase->ix_no_insert_disk_requester = 0;
  166.   ixbase->ix_allow_amiga_wildcard = 1;
  167.   ixbase->ix_do_not_flush_library = 0;
  168.   ixbase->ix_gmt_offset = 0;
  169.  
  170.   /* Read the GMT offset. This environment variable is 5 bytes long. The
  171.      first 4 form a long that contains the offset in seconds and the fifth
  172.      byte is ignored. */
  173.   if (GetVar("IXGMTOFFSET", buf, 6, GVF_BINARY_VAR) == 5 && IoErr() == 5)
  174.     memcpy(&ixbase->ix_gmt_offset, buf, 4);
  175.  
  176.   /* Set the hostname if the environment variable HOSTNAME exists. */
  177.   if (GetVar("HOSTNAME", buf, 256, 0) > 0)
  178.     sethostname(buf, strlen(buf));
  179.  
  180.   /* initialize the list structures for the allocator */
  181.   init_buddy ();
  182.   /* patch our library to optimally adapt to the given hardware */
  183.   ix_patch_functions (ixbase);
  184.  
  185.   ix_async_mp = (struct MsgPort *) CreateInterruptPort (0, 0, mp_interrupt, 0);
  186.   ix_tty_mp = 0; /* (struct MsgPort *) CreateInterruptPort (0, 0, tty_interrupt, 0);*/
  187.  
  188.   if (ixbase->ix_file_tab && ix_async_mp /* && ix_tty_mp */)
  189.     {
  190.       InitSemaphore (& ixbase->ix_semaph);
  191.  
  192.  
  193.       configure_context_switch ();
  194.  
  195.       NewList ((struct List *) &ixbase->ix_socket_list);
  196.  
  197.       for (i = 0; i < IX_NUM_SLEEP_QUEUES; i++)
  198.         NewList ((struct List *) &ixbase->ix_sleep_queues[i]);
  199.  
  200.       /* pass the array over to ix_expunge () */
  201.       ixbase->ix_libs = ix_libs;
  202.  
  203.       return ixbase;
  204.     }
  205.   if (ix_async_mp)
  206.     DeleteInterruptPort (ix_async_mp);
  207.  
  208. /*  if (ix_tty_mp)
  209.     DeleteInterruptPort (ix_tty_mp);*/
  210. /*rwl*/
  211. /*This formerly was without the 10, leaving 630 sizeof(struct file) unfreed!*/
  212. /* That's alot of memory to eat up and not free... :) */
  213.   if (ixbase->ix_file_tab)
  214.     FreeMem (ixbase->ix_file_tab, NOFILE * sizeof(struct file));
  215.   else
  216.     ix_panic ("out of memory");
  217.  
  218.   close_libraries (ix_libs);
  219.   
  220.   return 0;
  221. }      
  222.  
  223.  
  224. void
  225. ix_lock_base ()
  226. {
  227.   u_save.u_oldmask = u_save.p_sigmask;
  228.   u_save.p_sigmask = ~0;
  229.   ObtainSemaphore (& ix.ix_semaph);
  230. }
  231.  
  232. void
  233. ix_unlock_base ()
  234. {
  235.   ReleaseSemaphore (& ix.ix_semaph);
  236.   u_save.p_sigmask = u_save.u_oldmask;
  237. }
  238.  
  239.